//int sigaction(int signum, const struct sigaction* act, struct sigaction* oldact)
//类似于sigprocmask，第三个参数是输出性参数
#include <signal.h>
#include <iostream>

void handler(int sig)
{
    std::cout << "sig" << sig << std::endl;
    //不断获取pending表
    while(1)
    {
        sigset_t pending;
        sigemptyset(&pending);
        sigpending(&pending);
        for(int i = 31; i >= 1; i--)
        {
            if(sigismember(&pending, i))
            {
                std::cout << "1";
            }
            else
            {
                std::cout << "0";
            }
        }
        std::cout << std::endl;
        sleep(1);
    }
}

int main()
{
    struct sigaction act, oact;
    act.sa_handler = handler;//将结构体中的处理方法替换为自定义方法
    sigaction(SIGINT, &act, &oact);
    //当系统正在处理某个进程时，操作系统会将当前信号的block表相应信号置为1，不允许
    //同一个信号同时多次递达，只会在处理完一次后再处理下一次，否则就可能会出现递归调用
    //循环处理方法，导致占用内存大量资源
    //使用sigaction就可以屏蔽进行处理的相应信号，当解除的时候自动递达其他被屏蔽的同种
    //信号

    while(1)
    {
        std::cout << "hello world:" << getpid() << std::endl;
        sleep(1);
    }
    return 0;
}
